package com.itany.corejava.code16_反射;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年12月19日 11:16
 */
public class EmpFactoryMap {
    private static Map<String,String> map=new HashMap<>();
    static{
        BufferedReader br=new BufferedReader(new InputStreamReader(EmpFactoryMap.class.getClassLoader().getResourceAsStream("emp.properties")));
        String line=null;
        try {
            while((line=br.readLine())!=null){
                String[] arr=line.split("=");
                map.put(arr[0],arr[1]);

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Emp getEmp() throws IllegalAccessException, InstantiationException {
        // 将emp.properties中存储到Properties集合中去
        // 通过反射，创建Emp对象
        // 获取Emp的Class对象
        Class<Emp> c = Emp.class;

        //通过Class获取对应类的无参的构造方法创建对象
        Emp emp = c.newInstance();

        //获取Emp对象中所有属性
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields) {
            //获取对应属性上的注解
            Value annotation = field.getDeclaredAnnotation(Value.class);


            //获取注解的取值，将注解的取值作为Properties集合的key
            String key = annotation.value();


            //根据指定的key获取对应的集合中的value值
            String value =map.get(key);

            //因为所有属性都是private修饰，取消控制检查
            field.setAccessible(true);

            //为属性赋值
            field.set(emp, value);

        }

        return emp;
    }


}
